package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import negocio.ItemComanda;
import negocio.Plato;


public class DAOItemComanda {
	
	// ************************************************//
	// Este DAO es siempre llamado desde el DAOComanda //
	// ************************************************//
	
	private static DAOItemComanda instancia;
	
	private DAOItemComanda(){
			
	}
	
	public static DAOItemComanda getInstancia() {
		if(instancia == null)
			return instancia = new DAOItemComanda();
		return instancia;
	}
	
	//*******************************************************************************************************************//
	// ALTA
	//*******************************************************************************************************************//	
	
	public void crearItemComanda(int numeroComanda, ItemComanda ItemComanda){
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		try{
			String query =  "INSERT INTO ItemComanda "
			+ "(NroItem, NroComanda, Cantidad, NroPlato) "
			+ "VALUES (?,?,?,?)";
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.setInt(1, ItemComanda.getNroItem());
			preparedStatement.setInt(2, numeroComanda);
			preparedStatement.setInt(3, ItemComanda.getCantidad());
			preparedStatement.setFloat(4, ItemComanda.getPlato().getNroPlato());
			preparedStatement.execute();
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Info: DAOItemComanda.crearItemComanda(): El ItemComanda " + ItemComanda.getNroItem() + " de la Comanda " + numeroComanda + " se ha cargado exitosamente en la Base de Datos.");
		}
		catch (SQLException e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOItemComanda.crearItemComanda(): Error al intentar crear el ItemComanda " + ItemComanda.getNroItem() + " de la Comanda " + numeroComanda + " en la Base de Datos. " + e.getLocalizedMessage());
		}
		catch (Exception e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOItemComanda.crearItemComanda(): Error al intentar crear el ItemComanda "  + ItemComanda.getNroItem() + " de la Comanda " + numeroComanda + " en la Base de Datos. " + e.getLocalizedMessage());
		}
	}
	
	//*******************************************************************************************************************//
	// BUSQUEDA
	//*******************************************************************************************************************//

	public ItemComanda buscarItemComanda(int numeroComanda, String numeroItem) {
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		ItemComanda ItemComanda = null;
		try{
			String query =  "SELECT * FROM ItemComanda WHERE NroComanda = ? AND NroItem = ?";
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.setInt(1, numeroComanda);
			preparedStatement.setString(2, numeroItem);
			ResultSet result = preparedStatement.executeQuery();			
			while (result.next()){
				
				// Constructor ItemComanda:
				// int nroPlato, String nombre, int minutos, float precio)
				
				ItemComanda = new ItemComanda(
												result.getInt("cantidad"),
												result.getInt("NroItem"),
												DAOPlato.getInstancia().buscarPlato((result.getInt("NroPlato")))
												);
				
				AdministradorDeConexion.getInstancia().closeConnection(connection);
				return ItemComanda;
			}
		}
		catch (SQLException e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOItemComanda.buscarItemComanda(): Error al buscar el ItemComanda "  + ItemComanda.getNroItem() + " de la Comanda " + numeroComanda +  " en la Base de Datos. " + e.getLocalizedMessage());
		}
		catch (Exception e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOItemComanda.buscarItemComanda(): Error al buscar el ItemComanda "  + ItemComanda.getNroItem() + " de la Comanda " + numeroComanda +  " en la Base de Datos. " + e.getLocalizedMessage());
		}
		return null;
	}
	
	public Vector<ItemComanda> buscarTodosLosItemsDeLaComanda(int numeroComanda) {
		Connection connection = AdministradorDeConexion.getInstancia().connect();
		Vector<ItemComanda> vItemsComanda = null;
		try{
			String query =  "SELECT * FROM ItemComanda WHERE NroComanda = ?";
			PreparedStatement preparedStatement = null;
			preparedStatement = connection.prepareStatement(query);
			preparedStatement.setInt(1, numeroComanda);
			ResultSet result = preparedStatement.executeQuery();			
			vItemsComanda = new Vector<ItemComanda>();
			while (result.next()){
				
				// Constructor ItemComanda:
				// int nroPlato, String nombre, int minutos, float precio)
				
				ItemComanda ItemComanda = new ItemComanda(
												
												result.getInt("NroItem"),
												result.getInt("Cantidad"),
												DAOPlato.getInstancia().buscarPlato((result.getInt("NroPlato")))
												);
				
				// Agrego el ItemComanda dado de alta al vector de ItemsComanda.

				vItemsComanda.add(ItemComanda);
			}
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			return vItemsComanda;
		}
		catch (SQLException e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOItemComanda.buscarTodosLosItemsComanda(): Error al buscar todos los ItemsComanda asociados a la Comanda "
			+ numeroComanda + " en la Base de Datos. " + e.getLocalizedMessage());
		}
		catch (Exception e) {
			AdministradorDeConexion.getInstancia().closeConnection(connection);
			System.out.println("Error: DAOItemComanda.buscarTodosLosItemsComanda(): Error al buscar todos los ItemsComanda asociados a la Comanda "
			+ numeroComanda + " en la Base de Datos. " + e.getLocalizedMessage());
		}
		return null;
	}

}
